/*
 * @(#)XfspRuleConverter.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.rulebases;

import xfuzzy.lang.Rule;
import xfuzzy.lang.KnowledgeBase;

/**
 * <p> <b>Descripci�n:</b> convierte bases de reglas bien a su forma expandida,
 * bien a su forma compacta. Tambi�n act�a como f�brica de conversores
 * concretos.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.6
 * @see XfspModel
 * @see XfspCompactBuilder
 * @see XfspExpandBuilder
 *
 */
public abstract class XfspRuleConverter {

  /**
   * <p> <b>Descripci�n:</b> crea un conversor concreto de bases de reglas. El
   * tipo de conversor viene determinado por el argumento <i>type<\i>.
   * @param type Tipo de conversor que se va a crear. Los valores permitidos
   * son <i>Union<\i> o <i>Separation<\i>.
   * @param rb Base de reglas que debe transformar el conversor creado.
   *
   */
  public static XfspRuleConverter create(String type, KnowledgeBase rb){
    //conversor que se crear�
    XfspRuleConverter converter = null;
    //si el tipo de conversor a crear es de uni�n de reglas con mismos
    //consecuentes...
    if (type.equals("Union")) {
      //...crea el convesor de la clase XfspCompactBuilder
      converter = new XfspCompactBuilder(rb);
    }
    //si el tipo de conversor a crear es de separaci�n de reglas con OR en su
    //premisa...
    else if (type.equals("Separation")) {
      //...crea el conversor de la clase XfspExpandBuilder
      converter = new XfspExpandBuilder(rb);
    }
    return converter;
  }

  /**
   * <p> <b>Descripci�n:</b> transforma una regla, bien para expandirla, bien
   * para compactarla.
   * @param rule Regla convertida a su forma expandida o compacta.
   *
   */
  public void buildRule(Rule rule) {
  }

  /**
   * <p> <b>Descripci�n:</b> obtiene la base de reglas que se ha ido creando
   * de forma incremental conforme se convert�an las reglas que se le pasaban
   * al conversor.
   * @return Base de reglas que se ha creado a partir de las reglas que se han
   * ido convirtiendo.
   *
   */
  public abstract KnowledgeBase getRulebase();
}
